import {CodeMirror} from "./CodeMirror.js"
import {activeElt} from "../util/dom.js"
import {off, on} from "../util/event.js"
import {copyObj} from "../util/misc.js"

export function fromTextArea(textarea, options) {
    options = options ? copyObj(options) : {}
    options.value = textarea.value
    if (!options.tabindex && textarea.tabIndex)
        options.tabindex = textarea.tabIndex
    if (!options.placeholder && textarea.placeholder)
        options.placeholder = textarea.placeholder
    // Set autofocus to true if this textarea is focused, or if it has
    // autofocus and no other element is focused.
    if (options.autofocus == null) {
        let hasFocus = activeElt()
        options.autofocus = hasFocus == textarea ||
            textarea.getAttribute("autofocus") != null && hasFocus == document.body
    }

    function save() {
        textarea.value = cm.getValue()
    }

    let realSubmit
    if (textarea.form) {
        on(textarea.form, "submit", save)
        // Deplorable hack to make the submit method do the right thing.
        if (!options.leaveSubmitMethodAlone) {
            let form = textarea.form
            realSubmit = form.submit
            try {
                let wrappedSubmit = form.submit = () => {
                    save()
                    form.submit = realSubmit
                    form.submit()
                    form.submit = wrappedSubmit
                }
            } catch (e) {
            }
        }
    }

    options.finishInit = cm => {
        cm.save = save
        cm.getTextArea = () => textarea
        cm.toTextArea = () => {
            cm.toTextArea = isNaN // Prevent this from being ran twice
            save()
            textarea.parentNode.removeChild(cm.getWrapperElement())
            textarea.style.display = ""
            if (textarea.form) {
                off(textarea.form, "submit", save)
                if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function")
                    textarea.form.submit = realSubmit
            }
        }
    }

    textarea.style.display = "none"
    let cm = CodeMirror(node => textarea.parentNode.insertBefore(node, textarea.nextSibling),
        options)
    return cm
}
